﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cine
{
    public class VentaRepository: IVentaRepository
    {
        private IList<Venta> _listaVentas;
        private IList<Venta> _listaDevolucion;
        private long _idAuto;

        public ISesionRepository SesionRepositorio { get; set; }

        public VentaRepository()
        {
            _listaVentas = new List<Venta>();
            _idAuto = 1; // Id Autonumérico para las nuevas ventas
            _listaDevolucion = new List<Venta>();
        }

        public Venta Create(Venta venta)
        {
            venta.Id = _idAuto;
            _idAuto++;
            _listaVentas.Add(venta);
            
            return venta;
        }


        public double TotalDevolucionVenta(long idVenta)
        {
            int index;
            double devolucion=0;
           //recorro la lista de ventas busco el id de un venta alaceno el importe de la venta y su indice para borrar 
            //y el objeto borrado para añadir a la nieva lista
            foreach ( Venta venta in _listaVentas)
            {               
                if (venta.Id == idVenta) {
                    _listaDevolucion.Add(venta);

                    devolucion = venta.Precio;//recojo el total de esa venta
                    index = _listaVentas.IndexOf(venta);//devuelve la posicion de un objeto
                    _listaVentas.RemoveAt(index);//borra de un espacifico index
                    break;//sale del bucle              
                }               
            }
            //si no cumple la condicion la devolucion es 0 €  sino el precio de la venta eliminada de las ventas y añadida a las devoluciones


            return devolucion;
        }

        public Venta Read(long id)
        {
            Venta resultado = null;
            foreach (Venta venta in _listaVentas)
            {
                if (venta.Id == id)
                {
                    resultado = venta;
                    break;
                }
            }
            return resultado;
        }

        public IList<Venta> List()
        {
            IList<Venta> resultado = new List<Venta>();

            foreach (Venta venta in _listaVentas)
            {
                resultado.Add(venta);
            }
            return resultado;
        }

        public IList<Venta> List(Sesion sesion)
        {
            return List(sesion.Id);
        }

        public IList<Venta> List(long idSesion)
        {
            IList<Venta> resultado = new List<Venta>();

            foreach (Venta venta in _listaVentas)
            {
                if (venta.Sesion.Id == idSesion)
                {
                    resultado.Add(venta);
                }
            }

            return resultado;//devuelve una lista  de las sesion en una sala
        }

        public Venta Update(Venta venta)
        {
            throw new NotImplementedException();
        }

        public void Delete(long id)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Calcula el importe total de todas las ventas.
        /// </summary>
        /// <returns>Importe total en euros.</returns>
        public double CalcularTotalVentas()
        {
            double resultado = 0.0;
            IList<Venta> ventas = List();
            foreach (Venta venta in ventas)
            {
                resultado += venta.Precio;
            }
            return resultado;
        }

        /// <summary>
        /// Calcula el importe total de las ventas de una sesión dada.
        /// </summary>
        /// <param name="idSesion">Identificador de la sesión.</param>
        /// <returns>Importe total en euros.</returns>
        public double CalcularTotalVentasSesion(long idSesion)
        {
            double resultado = 0;
            IList<Venta> ventas = List(idSesion);
            foreach (Venta venta in ventas)
            {
                resultado += venta.Precio;
            }
            return resultado;
        }

        /// <summary>
        /// Calcula el importe total de las ventas de todas las sesiones de una sala dada.
        /// </summary>
        /// <param name="idSala">Identificador de la sala.</param>
        /// <returns>Importe total en euros.</returns>
        public double CalcularTotalVentasSala(long idSala)
        {
            double resultado = 0.0;
            IList<Sesion> sesiones = SesionRepositorio.List(idSala);
            foreach (Sesion sesion in sesiones)
            {
                resultado += CalcularTotalVentasSesion(sesion.Id);
            }
            return resultado;
        }

        /// <summary>
        /// Calcula el número total de entradas vendidas.
        /// </summary>
        /// <returns>Número total de entradas vendidas.</returns>
        public int CalcularEntradasVendidas()
        {
            int resultado = 0;
            IList<Venta> ventas = List();
            foreach (Venta venta in ventas)
            {
                resultado += venta.NEntradas;
            }
            return resultado;
        }

        /// <summary>
        /// Calcula el número de entradas vendidas para la sesión dada.
        /// </summary>
        /// <param name="idSesion">Identificador de la sesión.</param>
        /// <returns>Número de entradas vendidas.</returns>
        public int CalcularEntradasVendidasSesion(long idSesion)
        {
            int resultado = 0;
            IList<Venta> ventas = List(idSesion);
            foreach (Venta venta in ventas)
            {
                resultado += venta.NEntradas;
            }
            return resultado;
        }

        /// <summary>
        /// Calcula el número de entradas vendidas para la sala dada.
        /// </summary>
        /// <param name="idSala">Identificador de la sala.</param>
        /// <returns>Número de entradas vendidas.</returns>
        public int CalcularEntradasVendidasSala(long idSala)
        {
            int resultado = 0;
            IList<Sesion> sesiones = SesionRepositorio.List(idSala);
            foreach (Sesion sesion in sesiones)
            {
                resultado += CalcularEntradasVendidasSesion(sesion.Id);
            }
            return resultado;
        }
    }
}
